package model.simulationmodel.logicelements;

import model.editormodel.Input;
import model.editormodel.LogicEditorElement;
import model.editormodel.Output;
import model.simulationmodel.LogicValue;
import model.simulationmodel.SimulationModel;

/**
 * <b>Erbt:</b> <code>LogicSimulationElement</code> <br>
 * <b>Funktion:</b> Umsetzung der Logik eines XOR-Gatters<br>
 * <b>Logik:</b> a = Eingang1, b = Eingang2, o = Ausgang <br>
 * a | b || o <br>
 * ------------<br>
 * 1 | 1 || 0 <br>
 * 1 | 0 || 1 <br>
 * 0 | 1 || 1 <br>
 * 0 | 0 || 0 <br> ...
 * <br>
 * Repraesentiert ein Standard XOR-Gatter.
 * 
 * @author Team Locsi
 * 
 */
public class LogicXOR extends LogicSimulationElement {

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>LogicXOR</code>-Objekt.
	 * 
	 * @param sModel
	 *            <code>SimulationModel</code> - Referenz auf das
	 *            <code>SimulationModel</code>
	 * @param logicEditorElement
	 *            <code>LogicEditorElement</code> - Referenz auf das zugehoerige
	 *            <code>LogicEditorElement</code>
	 */
	public LogicXOR(SimulationModel sModel,
			LogicEditorElement logicEditorElement) {
		super(sModel, logicEditorElement);
	}

	@Override
	public void calcLogicValue() {

		// zu berechnender Wert
		LogicValue calcedValue = LogicValue.UNDEFINED;

		// logische Werte an den Eingaengen holen
		LogicValue a = logicInputValueMap.get(Input.STD_A);
		LogicValue b = logicInputValueMap.get(Input.STD_B);

		// Berechnung des XOR-Gatters
		if ((a == LogicValue.L0) || (a == LogicValue.L1)) {
			if (a == b) {
				calcedValue = LogicValue.L0;
			} else {
				if (b != LogicValue.UNDEFINED)
					calcedValue = LogicValue.L1;
			}
		}

		// Output wird nur gesetzt wenn sich der Wert am Ausgang aendern wuerde
		if (calcedValue != logicOutputValueMap.get(Output.STD_O)) {
			this.setOutputValue(Output.STD_O, calcedValue);
		}
	}
}